package com.guigu.gulicommon.tools;

import com.alibaba.fastjson.JSONObject;

import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.Map;

/**
 * java bean 工具类
 *
 * @author 陈俊杰
 * @since 2024-8-3
 */
public class BeanTool {


    /**
     * 排除指定属性并检查剩余字段是否都为空。
     *
     * @param obj           要检查的对象
     * @param clazz         对象的类
     * @param excludeFields 需要排除的字段名称列表
     * @return 如果剩余的所有字段都为空，则返回true；否则返回false
     * @throws IllegalAccessException 如果访问字段时出现异常
     */
    public static boolean checkAndExcludeFields(Object obj, Class<?> clazz, String... excludeFields) throws IllegalAccessException {
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            // 避免处理需要排除的字段
            if (Arrays.asList(excludeFields).contains(field.getName())) {
                continue;
            }

            // 设置访问权限，即使字段是私有的也能访问
            field.setAccessible(true);

            // 获取字段的值
            Object fieldValue = field.get(obj);

            // 如果找到非空值，则返回false
            if (fieldValue != null) {
                return false;
            }
        }

        // 如果所有字段都是空，则返回true
        return true;
    }

    /**
     * map转对象
     *
     * @param map  map
     * @param clzz 对象类型
     * @return 对象
     */
    public static <T> T mapToObj(Map<String, Object> map, Class<T> clzz) {
        return JSONObject.parseObject(JSONObject.toJSONString(map), clzz);
    }

    /**
     * 对象转map
     *
     * @param obj 对象
     * @return map map
     */
    public static <T> Map<String, Object> objToMap(T obj) {
        return JSONObject.parseObject(JSONObject.toJSONString(obj), Map.class);
    }
}
